package com.zzgc.modules.aspact;

import com.alibaba.fastjson.JSON;
import com.zzgc.common.dao.StudentDao;
import com.zzgc.common.entity.Student;
import com.zzgc.common.response.Result;
import com.zzgc.common.utils.HttpClientUtil;
import com.zzgc.modules.controller.BaseController;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.util.*;

/**
 * AOP 切入一个切面，当删除学生的时候，发送请求同步删除省级学生数据（不删除档案信息）
 * @Author:
 * @CreateTime: 2023-05-26  16:49
 * @Description:
 * @Version: 1.0
 */
@Component
@Aspect
public class AspactTest extends BaseController {
    /**
     * （1）Target：目标类，要被代理的类，例如，UserService；
     * （2）JoinPoint（连接点）：所谓的连接点，是指那些被拦截到的方法；
     * （3）PointCut（切入点）：被增强的连接点（所谓的增强其实就是添加的新功能）；
     * （4）Advice（通知、增强），增强代码；
     * （5）Weaving（织入）：是指把增强的advice应用到目标对象target来创建新的代理对象proxy的 过程。
     * （6）proxy：代理类；
     * （7）Aspect（切面）：是切入点pointcut和通知advice的结合。
     *
     */
    // 定义一个切入点
    @Pointcut("execution(public * com.zzgc.common.dao.StudentDao.deleteById(..))")
    public void deleteById() { }

    @Pointcut("execution(public * com.zzgc.common.dao.StudentDao.deleteByIds(..))")
    public void deleteByIds() { }
        @Autowired
    StudentDao studentDao;

    /**
     *  删除单个学生的增强
     * @Author
     * @Description
     * @Date  2023/5/27 14:49
     * @Param
     * @return
     */
    @Before("deleteById()")
    public void beforeDeleteById(JoinPoint joinPoint) {
        System.out.println(joinPoint.getSignature().getName() + " 方法删除学生先删除省级学生-前置通知");
        // 根据学生Id查询学生信息
        Object[] args = joinPoint.getArgs();
        if (args.length != 1){
            throw new RuntimeException("请传入学生id");
        }
        Student student = studentDao.queryById(Long.valueOf(args[0].toString()));
        Map<Long, String> hashMap = new HashMap<>();
        // 确定studentId是唯一的
        hashMap.put(student.getSStudentId(), student.getSYear());
        String s = HttpClientUtil.doPost(portUrl + "vision/receive/del/students", hashMap);
        Result result = JSON.parseObject(s, Result.class);
        if (result.getCode() != 200) {
            throw new RuntimeException("删除省级学生数据失败！原因：" + result.getMsg());
        }
    }

    /**
     *  删除多个学生的增强
     * @Author
     * @Description
     * @Date  2023/5/27 14:47
     * @Param
     * @return
     */
    @Before("deleteByIds()")
    public void beforeDeleteByIds(JoinPoint joinPoint) {
        System.out.println(joinPoint.getSignature().getName() + " 方法删除学生先删除省级学生-前置通知");
        // 根据学生Id查询学生信息
        Object[] args = joinPoint.getArgs();
        if (args.length < 1){
            throw new RuntimeException("请传入学生id");
        }
        List<Student> students = (List<Student>) args[0];
        Map<Long, String> map = new HashMap<>();
        for (Student student : students) {
            map.put(student.getSStudentId(), student.getSYear());
        }
        String s = HttpClientUtil.doPost(portUrl + "vision/receive/del/students", map);
        Result result = JSON.parseObject(s, Result.class);
        if (result.getCode() != 200) {
            throw new RuntimeException("删除省级学生数据失败！原因：" + result.getMsg());
        }
    }

}
